Spravny/nespravny SQL dotaz na databazu

Otázka od: fabik@kinekus.sk

31. 10. 2004 23:30

Ahoj,
konponenty InterBase, FB1.5
Pokusam sa o vytvorenie takehoto stavu v mojom pokusnom programe cez SQL
prikazy:

1. Pridat riadok do FB databazy, a nasledne skocit v konponente DBGrid na
posledny riadok.
Moje riesenie:
LE_kontakt - pole, v ktorom je text, ktory chcem pridat ako novu vetu do
tabulky.

begin
  Query.SQL.Clear;
  
Query.SQL.Add('INSERT INTO kontakt (kontakt) VALUES
('''+LE_kontakt.text+''')');
  Query.Active:=TRUE;
  Query.SQL.Clear;
  Query.SQL.Add( 'Select * from kontakt' );
  Query.Active:=TRUE;
  Query.last;
end;

Vysledok: Funguje to.
Otazka1: Je v poriadku riadok Query.last, ak ma program vylucne "pracovat" s
databazou pomocou SQL prikazov ?

2. Editovat uzivatelom vybrany riadok, a pritom zostat po zmene v DBGrid na
rovnakom mieste ako pred editaciou.
Moje riesenie:
vyuzijem idkontakt, ktory sa generuje pred vlozenim riadku v trigger na zmenu
len v jednom riadku.
edit1 - pole v ktorom je text, ktory nahradi stary retazec aktualnej vety v
tabulke kontakt

var pozicia:TBookMark;
begin
  pozicia:=Query.GetBookmark;
  Query.SQL.Clear;
  
Query.SQL.Add('update kontakt set kontakt='''+Edit1.text+''' where
idfirma='''+Inttostr(QueryIDFIRMA.Value)+'''');
  Query.Active:=TRUE;
  Query.SQL.Clear;
  Query.SQL.Add( 'Select * from kontakt' );
  Query.Active:=TRUE;
  Query.GotoBookmark(pozicia);
end;

Vysledok:Funguje to.
Otazka2: Je to "ciste" riesenie editacie jedneho riadku ?
Otazka3: Je v poriadku riadok Query.GotoBookmark(pozicia), ak ma program
vylucne "pracovat" s databazou pomocou SQL prikazov ?

Dakujem za kazdy nazor.
Fabik Milan

Odpovedá: Milan Tomes

1. 11. 2004 6:49

Ahoj

> [mailto:delphi-l-owner@clexpert.cz]On Behalf Of fabik@kinekus.sk
> Sent: Sunday, October 31, 2004 11:30 PM
>
> 1. Pridat riadok do FB databazy, a nasledne skocit v konponente DBGrid na
> posledny riadok.
>
> begin
> Query.SQL.Clear;
>
Query.SQL.Add('INSERT INTO kontakt (kontakt) VALUES
> ('''+LE_kontakt.text+''')');
> Query.Active:=TRUE;
> Query.SQL.Clear;
> Query.SQL.Add( 'Select * from kontakt' );
> Query.Active:=TRUE;
> Query.last;
> end;
>
> Otazka1: Je v poriadku riadok Query.last, ak ma program vylucne
> "pracovat" s
> databazou pomocou SQL prikazov ?

Musis si uvedomit co je to SQL a co je to TDataset. SQL resp. DML (Data
manipulation language) je strukturovany jazyk urceny pro manipulaci s daty -
Update, Insert, Select. Jestlize se podivas podrobne na tyto prikazy, tak
nikde nenajdes ani zminku o navigaci. K tomu slouzi TDataSet - jde vlastne o
jakousi cache, ktera jednou prectene radky uchovava u klienta. Pokud vyvolas
prikaz Select, tak server posila jeden radek za druhym v poradi, ktere
odpovida dotazu, ale vubec se nestara o to k cemu a jakym zpusobem je
potrebujes. V TDataset to funguje tak, ze se pri otevreni nacte pouze tolik
zaznamu (min. 1) kolik je aktualne potreba napr. pro zobrazeni. Metoda Last
neudela tedy nic jineho, nez ze vynuti nacteni vsech radku do datasetu a
presune se na posledni zaznam. Ja osobne bych se tomuto vyvaroval - pokud
mas velkou tabulku s velkym poctem zaznamu, tak muze provedeni teto metody
trvat i velice dlouho.

Pokud provadis query s prikazem, ktery nevraci dataset (Insert, Update + DDL
prikazy), tak pouzij namisto Active := True metodu ExecSQL.

> 2. Editovat uzivatelom vybrany riadok, a pritom zostat po zmene v
> DBGrid na
> rovnakom mieste ako pred editaciou.
> Moje riesenie:
> vyuzijem idkontakt, ktory sa generuje pred vlozenim riadku v
> trigger na zmenu
> len v jednom riadku.
> edit1 - pole v ktorom je text, ktory nahradi stary retazec
> aktualnej vety v
> tabulke kontakt
>
> var pozicia:TBookMark;
> begin
> pozicia:=Query.GetBookmark;
> Query.SQL.Clear;
>
Query.SQL.Add('update kontakt set kontakt='''+Edit1.text+''' where
> idfirma='''+Inttostr(QueryIDFIRMA.Value)+'''');
> Query.Active:=TRUE;
> Query.SQL.Clear;
> Query.SQL.Add( 'Select * from kontakt' );
> Query.Active:=TRUE;
> Query.GotoBookmark(pozicia);
> end;
>
> Otazka2: Je to "ciste" riesenie editacie jedneho riadku ?

Celkem v poradku az na dve veci:
1. neuvolnujes bookmark pomoci FreeBookmark
2. ExecSQL

Jeste jedna poznamka - zkus misto pouziti Query.SQL.Clear a
Query.SQL.Add('aaa') pouzit Query.SQL.Text := 'aaa'.

S pozdravem

Milan Tomes